{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "anaconda-cloud": {},
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.5.2"
    },
    "colab": {
      "name": "延安油田 岩性分类.ipynb",
      "provenance": [],
      "collapsed_sections": [
        "HeCzbkegoxv3",
        "1WZaSxbaoxwD",
        "XDsp6A_Boxwd",
        "8fsJMjj5oxwq",
        "RnWfkNzXoxxI",
        "PsE3xm5loxxc"
      ],
      "toc_visible": true,
      "include_colab_link": true
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/sunyingjian/-Logging-related-network/blob/master/%E5%BB%B6%E5%AE%89%E6%B2%B9%E7%94%B0_%E5%B2%A9%E6%80%A7%E5%88%86%E7%B1%BB.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Cqy3vXXOMI06",
        "colab_type": "text"
      },
      "source": [
        "### <font size=5px color=\"red\">✦ *Google Colab 突破90分钟自动断开:</font>\n",
        "<p><font size=3px > 每60分钟自动运行代码以刷新90分钟断开限制. 打开 developer-settings (在你的浏览器) 快速健 Ctrl+Shift+I 然后按console 输入以下代码 Enter. ( mac 按 Option+Command+I)</p><b>复制以下隐藏代码粉贴在浏览器console！！不要关闭浏览器以免失效</b>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "3Z8cK8h2Avbv",
        "colab_type": "text"
      },
      "source": [
        "<code>function ClickConnect(){\n",
        "console.log(\"Working\"); \n",
        "document.querySelector(\"colab-connect-button\").click() \n",
        "}setInterval(ClickConnect,6000)</code>"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "jtClEMAMLVHw",
        "colab_type": "code",
        "cellView": "both",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 35
        },
        "outputId": "96724bfa-2f61-4e1b-e064-26f46a31855e"
      },
      "source": [
        "#@markdown <h3>← 输入了代码后运行以防止断开</h>\n",
        "\n",
        "\n",
        "import IPython\n",
        "from google.colab import output\n",
        "\n",
        "display(IPython.display.Javascript('''\n",
        " function ClickConnect(){\n",
        "   btn = document.querySelector(\"colab-connect-button\")\n",
        "   if (btn != null){\n",
        "     console.log(\"Click colab-connect-button\"); \n",
        "     btn.click() \n",
        "     }\n",
        "   \n",
        "   btn = document.getElementById('ok')\n",
        "   if (btn != null){\n",
        "     console.log(\"Click reconnect\"); \n",
        "     btn.click() \n",
        "     }\n",
        "  }\n",
        "  \n",
        "setInterval(ClickConnect,60000)\n",
        "'''))\n",
        "\n",
        "print(\"Done.\")"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "application/javascript": [
              "\n",
              " function ClickConnect(){\n",
              "   btn = document.querySelector(\"colab-connect-button\")\n",
              "   if (btn != null){\n",
              "     console.log(\"Click colab-connect-button\"); \n",
              "     btn.click() \n",
              "     }\n",
              "   \n",
              "   btn = document.getElementById('ok')\n",
              "   if (btn != null){\n",
              "     console.log(\"Click reconnect\"); \n",
              "     btn.click() \n",
              "     }\n",
              "  }\n",
              "  \n",
              "setInterval(ClickConnect,60000)\n"
            ],
            "text/plain": [
              "<IPython.core.display.Javascript object>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "Done.\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "aFEXKoC6o2wB",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 121
        },
        "outputId": "6a5997ed-69d5-4c10-b1e8-2ddb5276572b"
      },
      "source": [
        "! git clone https://github.com/sunyingjian/numpy-.git"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Cloning into 'numpy-'...\n",
            "remote: Enumerating objects: 11, done.\u001b[K\n",
            "remote: Counting objects: 100% (11/11), done.\u001b[K\n",
            "remote: Compressing objects: 100% (11/11), done.\u001b[K\n",
            "remote: Total 11 (delta 4), reused 0 (delta 0), pack-reused 0\u001b[K\n",
            "Unpacking objects: 100% (11/11), done.\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "1rJBO73lpHA7",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 124
        },
        "outputId": "bd27108e-ddcf-4ad8-86bc-4cfb37108bd1"
      },
      "source": [
        "import os\n",
        "from google.colab import drive\n",
        "drive.mount('/content/drive')\n",
        "path = \"/content/numpy-/3345train data.csv\""
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Go to this URL in a browser: https://accounts.google.com/o/oauth2/auth?client_id=947318989803-6bn6qk8qdgf4n4g3pfee6491hc0brc4i.apps.googleusercontent.com&redirect_uri=urn%3aietf%3awg%3aoauth%3a2.0%3aoob&response_type=code&scope=email%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdocs.test%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive.photos.readonly%20https%3a%2f%2fwww.googleapis.com%2fauth%2fpeopleapi.readonly\n",
            "\n",
            "Enter your authorization code:\n",
            "··········\n",
            "Mounted at /content/drive\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "MeV4EU9OodKN",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 104
        },
        "outputId": "770e4ae1-5e6d-4ac7-cacb-38de7e04470b"
      },
      "source": [
        "! git clone https://github.com/sunyingjian/Machine-Learning-From-Scratch.git"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Cloning into 'Machine-Learning-From-Scratch'...\n",
            "remote: Enumerating objects: 287, done.\u001b[K\n",
            "Receiving objects:   0% (1/287)   \rReceiving objects:   1% (3/287)   \rReceiving objects:   2% (6/287)   \rReceiving objects:   3% (9/287)   \rReceiving objects:   4% (12/287)   \rReceiving objects:   5% (15/287)   \rReceiving objects:   6% (18/287)   \rReceiving objects:   7% (21/287)   \rReceiving objects:   8% (23/287)   \rReceiving objects:   9% (26/287)   \rReceiving objects:  10% (29/287)   \rReceiving objects:  11% (32/287)   \rReceiving objects:  12% (35/287)   \rReceiving objects:  13% (38/287)   \rReceiving objects:  14% (41/287)   \rReceiving objects:  15% (44/287)   \rReceiving objects:  16% (46/287)   \rReceiving objects:  17% (49/287)   \rReceiving objects:  18% (52/287)   \rReceiving objects:  19% (55/287)   \rReceiving objects:  20% (58/287)   \rReceiving objects:  21% (61/287)   \rReceiving objects:  22% (64/287)   \rReceiving objects:  23% (67/287)   \rReceiving objects:  24% (69/287)   \rReceiving objects:  25% (72/287)   \rReceiving objects:  26% (75/287)   \rReceiving objects:  27% (78/287)   \rReceiving objects:  28% (81/287)   \rReceiving objects:  29% (84/287)   \rReceiving objects:  30% (87/287)   \rReceiving objects:  31% (89/287)   \rReceiving objects:  32% (92/287)   \rReceiving objects:  33% (95/287)   \rReceiving objects:  34% (98/287)   \rReceiving objects:  35% (101/287)   \rReceiving objects:  36% (104/287)   \rReceiving objects:  37% (107/287)   \rReceiving objects:  38% (110/287)   \rReceiving objects:  39% (112/287)   \rReceiving objects:  40% (115/287)   \rReceiving objects:  41% (118/287)   \rReceiving objects:  42% (121/287)   \rReceiving objects:  43% (124/287)   \rReceiving objects:  44% (127/287)   \rReceiving objects:  45% (130/287)   \rremote: Total 287 (delta 0), reused 0 (delta 0), pack-reused 287\u001b[K\n",
            "Receiving objects:  46% (133/287)   \rReceiving objects:  47% (135/287)   \rReceiving objects:  48% (138/287)   \rReceiving objects:  49% (141/287)   \rReceiving objects:  50% (144/287)   \rReceiving objects:  51% (147/287)   \rReceiving objects:  52% (150/287)   \rReceiving objects:  53% (153/287)   \rReceiving objects:  54% (155/287)   \rReceiving objects:  55% (158/287)   \rReceiving objects:  56% (161/287)   \rReceiving objects:  57% (164/287)   \rReceiving objects:  58% (167/287)   \rReceiving objects:  59% (170/287)   \rReceiving objects:  60% (173/287)   \rReceiving objects:  61% (176/287)   \rReceiving objects:  62% (178/287)   \rReceiving objects:  63% (181/287)   \rReceiving objects:  64% (184/287)   \rReceiving objects:  65% (187/287)   \rReceiving objects:  66% (190/287)   \rReceiving objects:  67% (193/287)   \rReceiving objects:  68% (196/287)   \rReceiving objects:  69% (199/287)   \rReceiving objects:  70% (201/287)   \rReceiving objects:  71% (204/287)   \rReceiving objects:  72% (207/287)   \rReceiving objects:  73% (210/287)   \rReceiving objects:  74% (213/287)   \rReceiving objects:  75% (216/287)   \rReceiving objects:  76% (219/287)   \rReceiving objects:  77% (221/287)   \rReceiving objects:  78% (224/287)   \rReceiving objects:  79% (227/287)   \rReceiving objects:  80% (230/287)   \rReceiving objects:  81% (233/287)   \rReceiving objects:  82% (236/287)   \rReceiving objects:  83% (239/287)   \rReceiving objects:  84% (242/287)   \rReceiving objects:  85% (244/287)   \rReceiving objects:  86% (247/287)   \rReceiving objects:  87% (250/287)   \rReceiving objects:  88% (253/287)   \rReceiving objects:  89% (256/287)   \rReceiving objects:  90% (259/287)   \rReceiving objects:  91% (262/287)   \rReceiving objects:  92% (265/287)   \rReceiving objects:  93% (267/287)   \rReceiving objects:  94% (270/287)   \rReceiving objects:  95% (273/287)   \rReceiving objects:  96% (276/287)   \rReceiving objects:  97% (279/287)   \rReceiving objects:  98% (282/287)   \rReceiving objects:  99% (285/287)   \rReceiving objects: 100% (287/287)   \rReceiving objects: 100% (287/287), 91.24 KiB | 4.34 MiB/s, done.\n",
            "Resolving deltas:   0% (0/133)   \rResolving deltas:  12% (16/133)   \rResolving deltas:  13% (18/133)   \rResolving deltas:  14% (19/133)   \rResolving deltas:  15% (21/133)   \rResolving deltas:  17% (23/133)   \rResolving deltas:  19% (26/133)   \rResolving deltas:  23% (31/133)   \rResolving deltas:  24% (33/133)   \rResolving deltas:  25% (34/133)   \rResolving deltas:  27% (36/133)   \rResolving deltas:  28% (38/133)   \rResolving deltas:  33% (44/133)   \rResolving deltas:  35% (47/133)   \rResolving deltas:  38% (51/133)   \rResolving deltas:  66% (88/133)   \rResolving deltas:  78% (105/133)   \rResolving deltas:  84% (113/133)   \rResolving deltas:  85% (114/133)   \rResolving deltas:  87% (117/133)   \rResolving deltas:  90% (121/133)   \rResolving deltas: 100% (133/133)   \rResolving deltas: 100% (133/133), done.\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "s5phM8LfoxvP",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 407
        },
        "outputId": "0358c03c-d4d8-410c-bb67-f6bad32ca913"
      },
      "source": [
        "%matplotlib inline\n",
        "#%matplotlib inline 可以在Ipython编译器里直接使用，功能是可以内嵌绘图，并且可以省略掉plt.show()这一步。\n",
        "import pandas as pd\n",
        "import numpy as np\n",
        "import matplotlib as mpl\n",
        "import matplotlib.pyplot as plt\n",
        "import matplotlib.colors as colors\n",
        "from mpl_toolkits.axes_grid1 import make_axes_locatable\n",
        "from pandas import set_option\n",
        "set_option(\"display.max_rows\", 10)#设置要显示的默认行数，显示的最大行数是10\n",
        "pd.options.mode.chained_assignment = None #为了在增加列表行数的时候防止出现setting with copy warning\n",
        "filename = 'facies_vectors.csv'\n",
        "training_data = pd.read_csv('/content/numpy-/3345train data.csv')\n",
        "training_data\n",
        "testing_data = pd.read_csv('/content/numpy-/3345test_data.csv')\n",
        "testing_data"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>AC</th>\n",
              "      <th>CAL</th>\n",
              "      <th>GR</th>\n",
              "      <th>K</th>\n",
              "      <th>RD</th>\n",
              "      <th>SP</th>\n",
              "      <th>Core Lithology</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>0.038756</td>\n",
              "      <td>0.026970</td>\n",
              "      <td>0.094776</td>\n",
              "      <td>0.112543</td>\n",
              "      <td>0.001420</td>\n",
              "      <td>0.614504</td>\n",
              "      <td>5</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>0.347382</td>\n",
              "      <td>0.090194</td>\n",
              "      <td>0.145150</td>\n",
              "      <td>0.202335</td>\n",
              "      <td>0.002744</td>\n",
              "      <td>0.339568</td>\n",
              "      <td>7</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>0.218400</td>\n",
              "      <td>0.059510</td>\n",
              "      <td>0.252165</td>\n",
              "      <td>0.711295</td>\n",
              "      <td>0.003874</td>\n",
              "      <td>0.918567</td>\n",
              "      <td>3</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>0.366064</td>\n",
              "      <td>0.082147</td>\n",
              "      <td>0.149304</td>\n",
              "      <td>0.201731</td>\n",
              "      <td>0.003290</td>\n",
              "      <td>0.343180</td>\n",
              "      <td>7</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>0.291877</td>\n",
              "      <td>0.079981</td>\n",
              "      <td>0.141782</td>\n",
              "      <td>0.289309</td>\n",
              "      <td>0.003455</td>\n",
              "      <td>0.344605</td>\n",
              "      <td>7</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>361</th>\n",
              "      <td>0.016947</td>\n",
              "      <td>0.138827</td>\n",
              "      <td>0.118400</td>\n",
              "      <td>0.358567</td>\n",
              "      <td>0.281687</td>\n",
              "      <td>0.302936</td>\n",
              "      <td>6</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>362</th>\n",
              "      <td>0.131043</td>\n",
              "      <td>0.069016</td>\n",
              "      <td>0.029354</td>\n",
              "      <td>0.060197</td>\n",
              "      <td>0.282093</td>\n",
              "      <td>0.253809</td>\n",
              "      <td>3</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>363</th>\n",
              "      <td>0.036182</td>\n",
              "      <td>0.032010</td>\n",
              "      <td>0.030090</td>\n",
              "      <td>0.071069</td>\n",
              "      <td>0.359737</td>\n",
              "      <td>0.435486</td>\n",
              "      <td>5</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>364</th>\n",
              "      <td>0.014562</td>\n",
              "      <td>0.127332</td>\n",
              "      <td>0.035014</td>\n",
              "      <td>0.178579</td>\n",
              "      <td>0.803566</td>\n",
              "      <td>0.311641</td>\n",
              "      <td>6</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>365</th>\n",
              "      <td>0.014427</td>\n",
              "      <td>0.134185</td>\n",
              "      <td>0.033460</td>\n",
              "      <td>0.186430</td>\n",
              "      <td>0.891134</td>\n",
              "      <td>0.311652</td>\n",
              "      <td>6</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>366 rows × 7 columns</p>\n",
              "</div>"
            ],
            "text/plain": [
              "           AC       CAL        GR         K        RD        SP  Core Lithology\n",
              "0    0.038756  0.026970  0.094776  0.112543  0.001420  0.614504               5\n",
              "1    0.347382  0.090194  0.145150  0.202335  0.002744  0.339568               7\n",
              "2    0.218400  0.059510  0.252165  0.711295  0.003874  0.918567               3\n",
              "3    0.366064  0.082147  0.149304  0.201731  0.003290  0.343180               7\n",
              "4    0.291877  0.079981  0.141782  0.289309  0.003455  0.344605               7\n",
              "..        ...       ...       ...       ...       ...       ...             ...\n",
              "361  0.016947  0.138827  0.118400  0.358567  0.281687  0.302936               6\n",
              "362  0.131043  0.069016  0.029354  0.060197  0.282093  0.253809               3\n",
              "363  0.036182  0.032010  0.030090  0.071069  0.359737  0.435486               5\n",
              "364  0.014562  0.127332  0.035014  0.178579  0.803566  0.311641               6\n",
              "365  0.014427  0.134185  0.033460  0.186430  0.891134  0.311652               6\n",
              "\n",
              "[366 rows x 7 columns]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 6
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "jCHjec61oxvd",
        "colab_type": "text"
      },
      "source": [
        "##训练集的处理"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "YAVy0Tvfoxvh",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 288
        },
        "outputId": "eae0f29e-b3ed-46a2-cddb-f5455ab30e5e"
      },
      "source": [
        "# 1=粗砂岩  2=中砂岩   3=细砂岩\n",
        "# 4=粉砂岩 5=白云岩 6=石灰岩 7=泥岩\n",
        "facies_colors = ['#F4D03F', '#F5B041','#DC7633','#6E2C00',\n",
        "       '#1B4F72','#2E86C1', '#AED6F1']\n",
        "\n",
        "facies_labels = ['CS', 'MS', 'FS', 'SS', 'DM',\n",
        "                 'LS', 'MDS']\n",
        "#facies_color_map is a dictionary that maps facies labels\n",
        "#to their respective colors\n",
        "facies_color_map = {}\n",
        "for ind, label in enumerate(facies_labels):\n",
        "    facies_color_map[label] = facies_colors[ind]\n",
        "training_data.describe()"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>AC</th>\n",
              "      <th>CAL</th>\n",
              "      <th>GR</th>\n",
              "      <th>K</th>\n",
              "      <th>RD</th>\n",
              "      <th>SP</th>\n",
              "      <th>Core Lithology</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>count</th>\n",
              "      <td>3.345000e+03</td>\n",
              "      <td>3.345000e+03</td>\n",
              "      <td>3.345000e+03</td>\n",
              "      <td>3.345000e+03</td>\n",
              "      <td>3.345000e+03</td>\n",
              "      <td>3345.000000</td>\n",
              "      <td>3345.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>mean</th>\n",
              "      <td>2.107992e-01</td>\n",
              "      <td>1.450162e-01</td>\n",
              "      <td>1.662901e-01</td>\n",
              "      <td>3.464980e-01</td>\n",
              "      <td>4.917120e-02</td>\n",
              "      <td>0.418110</td>\n",
              "      <td>4.221525</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>std</th>\n",
              "      <td>1.099814e-01</td>\n",
              "      <td>1.353280e-01</td>\n",
              "      <td>1.036918e-01</td>\n",
              "      <td>1.808527e-01</td>\n",
              "      <td>8.719010e-02</td>\n",
              "      <td>0.196548</td>\n",
              "      <td>2.079667</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>min</th>\n",
              "      <td>1.000000e-07</td>\n",
              "      <td>1.000000e-08</td>\n",
              "      <td>1.000000e-07</td>\n",
              "      <td>1.000000e-07</td>\n",
              "      <td>1.000000e-09</td>\n",
              "      <td>-0.062739</td>\n",
              "      <td>1.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>25%</th>\n",
              "      <td>1.594008e-01</td>\n",
              "      <td>5.225926e-02</td>\n",
              "      <td>8.778840e-02</td>\n",
              "      <td>2.079726e-01</td>\n",
              "      <td>1.270254e-02</td>\n",
              "      <td>0.325241</td>\n",
              "      <td>2.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>50%</th>\n",
              "      <td>2.124234e-01</td>\n",
              "      <td>9.779821e-02</td>\n",
              "      <td>1.520483e-01</td>\n",
              "      <td>3.352124e-01</td>\n",
              "      <td>2.403313e-02</td>\n",
              "      <td>0.384527</td>\n",
              "      <td>4.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>75%</th>\n",
              "      <td>2.574892e-01</td>\n",
              "      <td>1.850738e-01</td>\n",
              "      <td>2.359244e-01</td>\n",
              "      <td>4.811758e-01</td>\n",
              "      <td>4.815465e-02</td>\n",
              "      <td>0.439047</td>\n",
              "      <td>7.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>max</th>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000e+00</td>\n",
              "      <td>1.000000</td>\n",
              "      <td>7.000000</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "                 AC           CAL  ...           SP  Core Lithology\n",
              "count  3.345000e+03  3.345000e+03  ...  3345.000000     3345.000000\n",
              "mean   2.107992e-01  1.450162e-01  ...     0.418110        4.221525\n",
              "std    1.099814e-01  1.353280e-01  ...     0.196548        2.079667\n",
              "min    1.000000e-07  1.000000e-08  ...    -0.062739        1.000000\n",
              "25%    1.594008e-01  5.225926e-02  ...     0.325241        2.000000\n",
              "50%    2.124234e-01  9.779821e-02  ...     0.384527        4.000000\n",
              "75%    2.574892e-01  1.850738e-01  ...     0.439047        7.000000\n",
              "max    1.000000e+00  1.000000e+00  ...     1.000000        7.000000\n",
              "\n",
              "[8 rows x 7 columns]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 7
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "AMJylw1foxvk",
        "colab_type": "text"
      },
      "source": [
        "#测试集的处理"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "H-Scfnbsoxvl",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 288
        },
        "outputId": "9e2f20fc-e25c-4ca3-f907-4d3c5420584b"
      },
      "source": [
        "# 1=粗砂岩  2=中砂岩   3=细砂岩\n",
        "# 4=粉砂岩 5=白云岩 6=石灰岩 7=泥岩\n",
        "facies_colors = ['#F4D03F', '#F5B041','#DC7633','#6E2C00',\n",
        "       '#1B4F72','#2E86C1', '#AED6F1']\n",
        "\n",
        "facies_labels = ['CS', 'MS', 'FS', 'SS', 'DM',\n",
        "                 'LS', 'MDS']\n",
        "#facies_color_map is a dictionary that maps facies labels\n",
        "#to their respective colors\n",
        "facies_color_map = {}\n",
        "for ind, label in enumerate(facies_labels):\n",
        "    facies_color_map[label] = facies_colors[ind]\n",
        "testing_data.describe()"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>AC</th>\n",
              "      <th>CAL</th>\n",
              "      <th>GR</th>\n",
              "      <th>K</th>\n",
              "      <th>RD</th>\n",
              "      <th>SP</th>\n",
              "      <th>Core Lithology</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>count</th>\n",
              "      <td>366.000000</td>\n",
              "      <td>366.000000</td>\n",
              "      <td>366.000000</td>\n",
              "      <td>366.000000</td>\n",
              "      <td>366.000000</td>\n",
              "      <td>366.000000</td>\n",
              "      <td>366.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>mean</th>\n",
              "      <td>0.214074</td>\n",
              "      <td>0.148747</td>\n",
              "      <td>0.147995</td>\n",
              "      <td>0.330942</td>\n",
              "      <td>0.046567</td>\n",
              "      <td>0.389129</td>\n",
              "      <td>4.215847</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>std</th>\n",
              "      <td>0.108781</td>\n",
              "      <td>0.144160</td>\n",
              "      <td>0.087543</td>\n",
              "      <td>0.181384</td>\n",
              "      <td>0.080542</td>\n",
              "      <td>0.196271</td>\n",
              "      <td>2.072619</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>min</th>\n",
              "      <td>0.003611</td>\n",
              "      <td>0.007118</td>\n",
              "      <td>0.005029</td>\n",
              "      <td>0.025971</td>\n",
              "      <td>0.001420</td>\n",
              "      <td>-0.061365</td>\n",
              "      <td>1.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>25%</th>\n",
              "      <td>0.162638</td>\n",
              "      <td>0.052989</td>\n",
              "      <td>0.079442</td>\n",
              "      <td>0.194786</td>\n",
              "      <td>0.012828</td>\n",
              "      <td>0.317109</td>\n",
              "      <td>2.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>50%</th>\n",
              "      <td>0.215371</td>\n",
              "      <td>0.098682</td>\n",
              "      <td>0.132807</td>\n",
              "      <td>0.302396</td>\n",
              "      <td>0.022275</td>\n",
              "      <td>0.379000</td>\n",
              "      <td>4.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>75%</th>\n",
              "      <td>0.269240</td>\n",
              "      <td>0.179492</td>\n",
              "      <td>0.217013</td>\n",
              "      <td>0.456563</td>\n",
              "      <td>0.047410</td>\n",
              "      <td>0.435390</td>\n",
              "      <td>7.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>max</th>\n",
              "      <td>0.713160</td>\n",
              "      <td>0.994694</td>\n",
              "      <td>0.483319</td>\n",
              "      <td>0.994363</td>\n",
              "      <td>0.891134</td>\n",
              "      <td>0.997070</td>\n",
              "      <td>7.000000</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "               AC         CAL  ...          SP  Core Lithology\n",
              "count  366.000000  366.000000  ...  366.000000      366.000000\n",
              "mean     0.214074    0.148747  ...    0.389129        4.215847\n",
              "std      0.108781    0.144160  ...    0.196271        2.072619\n",
              "min      0.003611    0.007118  ...   -0.061365        1.000000\n",
              "25%      0.162638    0.052989  ...    0.317109        2.000000\n",
              "50%      0.215371    0.098682  ...    0.379000        4.000000\n",
              "75%      0.269240    0.179492  ...    0.435390        7.000000\n",
              "max      0.713160    0.994694  ...    0.997070        7.000000\n",
              "\n",
              "[8 rows x 7 columns]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 8
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "24iOGnKzoxvo",
        "colab_type": "text"
      },
      "source": [
        "##画个图"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "3l3m-Xj7oxvp",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 432
        },
        "outputId": "2104169d-479a-442b-91f9-471b1d0a5a7c"
      },
      "source": [
        "#count the number of unique entries for each facies, sort them by facies number (instead of by number of entries)\n",
        "#计算每个相的唯一条目数，然后按相数（而不是条目数）对它们进行排序\n",
        "facies_counts = training_data['Core Lithology'].value_counts().sort_index()\n",
        "#use facies labels to index each count\n",
        "#使用相标签索引每个计数\n",
        "facies_counts.index = facies_labels\n",
        "\n",
        "facies_counts.plot(kind='bar',color=facies_colors, \n",
        "                   title='Distribution of Training Data by Facies')\n",
        "facies_counts"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "CS     194\n",
              "MS     710\n",
              "FS     751\n",
              "SS     166\n",
              "DM     482\n",
              "LS     114\n",
              "MDS    928\n",
              "Name: Core Lithology, dtype: int64"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 9
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "HeCzbkegoxv3",
        "colab_type": "text"
      },
      "source": [
        "##继续处理数据"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "scrolled": true,
        "id": "fdx8XRKqoxv3",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 288
        },
        "outputId": "1ea1780c-22ee-4971-feae-c0b68e27c9eb"
      },
      "source": [
        "correct_facies_labels = training_data['Core Lithology'].values\n",
        "correct_facies_labels_test = testing_data['Core Lithology'].values\n",
        "feature_vectors = training_data.drop(['Core Lithology'], axis=1)\n",
        "feature_vectors_test = testing_data.drop(['Core Lithology'], axis=1)\n",
        "feature_vectors.describe()\n",
        "feature_vectors_test.describe()"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>AC</th>\n",
              "      <th>CAL</th>\n",
              "      <th>GR</th>\n",
              "      <th>K</th>\n",
              "      <th>RD</th>\n",
              "      <th>SP</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>count</th>\n",
              "      <td>366.000000</td>\n",
              "      <td>366.000000</td>\n",
              "      <td>366.000000</td>\n",
              "      <td>366.000000</td>\n",
              "      <td>366.000000</td>\n",
              "      <td>366.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>mean</th>\n",
              "      <td>0.214074</td>\n",
              "      <td>0.148747</td>\n",
              "      <td>0.147995</td>\n",
              "      <td>0.330942</td>\n",
              "      <td>0.046567</td>\n",
              "      <td>0.389129</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>std</th>\n",
              "      <td>0.108781</td>\n",
              "      <td>0.144160</td>\n",
              "      <td>0.087543</td>\n",
              "      <td>0.181384</td>\n",
              "      <td>0.080542</td>\n",
              "      <td>0.196271</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>min</th>\n",
              "      <td>0.003611</td>\n",
              "      <td>0.007118</td>\n",
              "      <td>0.005029</td>\n",
              "      <td>0.025971</td>\n",
              "      <td>0.001420</td>\n",
              "      <td>-0.061365</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>25%</th>\n",
              "      <td>0.162638</td>\n",
              "      <td>0.052989</td>\n",
              "      <td>0.079442</td>\n",
              "      <td>0.194786</td>\n",
              "      <td>0.012828</td>\n",
              "      <td>0.317109</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>50%</th>\n",
              "      <td>0.215371</td>\n",
              "      <td>0.098682</td>\n",
              "      <td>0.132807</td>\n",
              "      <td>0.302396</td>\n",
              "      <td>0.022275</td>\n",
              "      <td>0.379000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>75%</th>\n",
              "      <td>0.269240</td>\n",
              "      <td>0.179492</td>\n",
              "      <td>0.217013</td>\n",
              "      <td>0.456563</td>\n",
              "      <td>0.047410</td>\n",
              "      <td>0.435390</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>max</th>\n",
              "      <td>0.713160</td>\n",
              "      <td>0.994694</td>\n",
              "      <td>0.483319</td>\n",
              "      <td>0.994363</td>\n",
              "      <td>0.891134</td>\n",
              "      <td>0.997070</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "               AC         CAL          GR           K          RD          SP\n",
              "count  366.000000  366.000000  366.000000  366.000000  366.000000  366.000000\n",
              "mean     0.214074    0.148747    0.147995    0.330942    0.046567    0.389129\n",
              "std      0.108781    0.144160    0.087543    0.181384    0.080542    0.196271\n",
              "min      0.003611    0.007118    0.005029    0.025971    0.001420   -0.061365\n",
              "25%      0.162638    0.052989    0.079442    0.194786    0.012828    0.317109\n",
              "50%      0.215371    0.098682    0.132807    0.302396    0.022275    0.379000\n",
              "75%      0.269240    0.179492    0.217013    0.456563    0.047410    0.435390\n",
              "max      0.713160    0.994694    0.483319    0.994363    0.891134    0.997070"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 10
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "MEDwUBRLoxv6",
        "colab_type": "text"
      },
      "source": [
        "Scikit includes a [preprocessing](http://scikit-learn.org/stable/modules/preprocessing.html) module that can 'standardize' the data (giving each variable zero mean and unit variance, also called *whitening*).  Many machine learning algorithms assume features will be standard normally distributed data (ie: Gaussian with zero mean and unit variance).  The factors used to standardize the training set must be applied to any subsequent feature set that will be input to the classifier.  The `StandardScalar` class can be fit to the training set, and later used to standardize any training data.\n",
        "\n",
        "Scikit包含一个预处理模块，可以“标准化”数据（赋予每个变量零均值和单位方差，也称为白化）。 许多机器学习算法都假定特征将是标准的正态分布数据（即：均值和单位方差为零的高斯）。 用于标准化训练集的因素必须应用于将输入到分类器的任何后续功能集中。 StandardScalar类可以适合于训练集，并在以后用于标准化任何训练数据。"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "bz6rBg4ooxv6",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "from sklearn import preprocessing\n",
        "\n",
        "scaler = preprocessing.StandardScaler().fit(feature_vectors)\n",
        "scaled_features = scaler.transform(feature_vectors)\n",
        "scaler_test = preprocessing.StandardScaler().fit(feature_vectors_test)\n",
        "scaled_features_test = scaler.transform(feature_vectors_test)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "IiC-N8VUoxv9",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 407
        },
        "outputId": "507eb7a2-d97b-4db3-b276-e495eaba3949"
      },
      "source": [
        "feature_vectors"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>AC</th>\n",
              "      <th>CAL</th>\n",
              "      <th>GR</th>\n",
              "      <th>K</th>\n",
              "      <th>RD</th>\n",
              "      <th>SP</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>0.029102</td>\n",
              "      <td>0.031789</td>\n",
              "      <td>0.026724</td>\n",
              "      <td>0.202335</td>\n",
              "      <td>0.078986</td>\n",
              "      <td>0.333754</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>0.032883</td>\n",
              "      <td>0.033469</td>\n",
              "      <td>0.030592</td>\n",
              "      <td>0.203141</td>\n",
              "      <td>0.076064</td>\n",
              "      <td>0.333669</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>0.034385</td>\n",
              "      <td>0.037006</td>\n",
              "      <td>0.032359</td>\n",
              "      <td>0.200121</td>\n",
              "      <td>0.074503</td>\n",
              "      <td>0.333619</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>0.243816</td>\n",
              "      <td>0.143381</td>\n",
              "      <td>0.086581</td>\n",
              "      <td>0.290115</td>\n",
              "      <td>0.017649</td>\n",
              "      <td>0.094025</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>0.248043</td>\n",
              "      <td>0.146786</td>\n",
              "      <td>0.084643</td>\n",
              "      <td>0.283874</td>\n",
              "      <td>0.017286</td>\n",
              "      <td>0.090554</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3340</th>\n",
              "      <td>0.012092</td>\n",
              "      <td>0.067866</td>\n",
              "      <td>0.007657</td>\n",
              "      <td>0.077713</td>\n",
              "      <td>0.181798</td>\n",
              "      <td>0.348797</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3341</th>\n",
              "      <td>0.011831</td>\n",
              "      <td>0.069989</td>\n",
              "      <td>0.007606</td>\n",
              "      <td>0.081135</td>\n",
              "      <td>0.206839</td>\n",
              "      <td>0.348560</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3342</th>\n",
              "      <td>0.011533</td>\n",
              "      <td>0.070121</td>\n",
              "      <td>0.009591</td>\n",
              "      <td>0.081337</td>\n",
              "      <td>0.250115</td>\n",
              "      <td>0.348470</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3343</th>\n",
              "      <td>0.008903</td>\n",
              "      <td>0.069325</td>\n",
              "      <td>0.010596</td>\n",
              "      <td>0.081135</td>\n",
              "      <td>0.281774</td>\n",
              "      <td>0.348340</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3344</th>\n",
              "      <td>0.003230</td>\n",
              "      <td>0.070210</td>\n",
              "      <td>0.012674</td>\n",
              "      <td>0.080129</td>\n",
              "      <td>0.329088</td>\n",
              "      <td>0.348228</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>3345 rows × 6 columns</p>\n",
              "</div>"
            ],
            "text/plain": [
              "            AC       CAL        GR         K        RD        SP\n",
              "0     0.029102  0.031789  0.026724  0.202335  0.078986  0.333754\n",
              "1     0.032883  0.033469  0.030592  0.203141  0.076064  0.333669\n",
              "2     0.034385  0.037006  0.032359  0.200121  0.074503  0.333619\n",
              "3     0.243816  0.143381  0.086581  0.290115  0.017649  0.094025\n",
              "4     0.248043  0.146786  0.084643  0.283874  0.017286  0.090554\n",
              "...        ...       ...       ...       ...       ...       ...\n",
              "3340  0.012092  0.067866  0.007657  0.077713  0.181798  0.348797\n",
              "3341  0.011831  0.069989  0.007606  0.081135  0.206839  0.348560\n",
              "3342  0.011533  0.070121  0.009591  0.081337  0.250115  0.348470\n",
              "3343  0.008903  0.069325  0.010596  0.081135  0.281774  0.348340\n",
              "3344  0.003230  0.070210  0.012674  0.080129  0.329088  0.348228\n",
              "\n",
              "[3345 rows x 6 columns]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 12
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "fupaX5dO8_th",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 407
        },
        "outputId": "8ac67272-d3f0-4413-ef0c-0ad5e3194d20"
      },
      "source": [
        "feature_vectors_test"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>AC</th>\n",
              "      <th>CAL</th>\n",
              "      <th>GR</th>\n",
              "      <th>K</th>\n",
              "      <th>RD</th>\n",
              "      <th>SP</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>0.038756</td>\n",
              "      <td>0.026970</td>\n",
              "      <td>0.094776</td>\n",
              "      <td>0.112543</td>\n",
              "      <td>0.001420</td>\n",
              "      <td>0.614504</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>0.347382</td>\n",
              "      <td>0.090194</td>\n",
              "      <td>0.145150</td>\n",
              "      <td>0.202335</td>\n",
              "      <td>0.002744</td>\n",
              "      <td>0.339568</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>0.218400</td>\n",
              "      <td>0.059510</td>\n",
              "      <td>0.252165</td>\n",
              "      <td>0.711295</td>\n",
              "      <td>0.003874</td>\n",
              "      <td>0.918567</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>0.366064</td>\n",
              "      <td>0.082147</td>\n",
              "      <td>0.149304</td>\n",
              "      <td>0.201731</td>\n",
              "      <td>0.003290</td>\n",
              "      <td>0.343180</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>0.291877</td>\n",
              "      <td>0.079981</td>\n",
              "      <td>0.141782</td>\n",
              "      <td>0.289309</td>\n",
              "      <td>0.003455</td>\n",
              "      <td>0.344605</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>361</th>\n",
              "      <td>0.016947</td>\n",
              "      <td>0.138827</td>\n",
              "      <td>0.118400</td>\n",
              "      <td>0.358567</td>\n",
              "      <td>0.281687</td>\n",
              "      <td>0.302936</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>362</th>\n",
              "      <td>0.131043</td>\n",
              "      <td>0.069016</td>\n",
              "      <td>0.029354</td>\n",
              "      <td>0.060197</td>\n",
              "      <td>0.282093</td>\n",
              "      <td>0.253809</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>363</th>\n",
              "      <td>0.036182</td>\n",
              "      <td>0.032010</td>\n",
              "      <td>0.030090</td>\n",
              "      <td>0.071069</td>\n",
              "      <td>0.359737</td>\n",
              "      <td>0.435486</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>364</th>\n",
              "      <td>0.014562</td>\n",
              "      <td>0.127332</td>\n",
              "      <td>0.035014</td>\n",
              "      <td>0.178579</td>\n",
              "      <td>0.803566</td>\n",
              "      <td>0.311641</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>365</th>\n",
              "      <td>0.014427</td>\n",
              "      <td>0.134185</td>\n",
              "      <td>0.033460</td>\n",
              "      <td>0.186430</td>\n",
              "      <td>0.891134</td>\n",
              "      <td>0.311652</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>366 rows × 6 columns</p>\n",
              "</div>"
            ],
            "text/plain": [
              "           AC       CAL        GR         K        RD        SP\n",
              "0    0.038756  0.026970  0.094776  0.112543  0.001420  0.614504\n",
              "1    0.347382  0.090194  0.145150  0.202335  0.002744  0.339568\n",
              "2    0.218400  0.059510  0.252165  0.711295  0.003874  0.918567\n",
              "3    0.366064  0.082147  0.149304  0.201731  0.003290  0.343180\n",
              "4    0.291877  0.079981  0.141782  0.289309  0.003455  0.344605\n",
              "..        ...       ...       ...       ...       ...       ...\n",
              "361  0.016947  0.138827  0.118400  0.358567  0.281687  0.302936\n",
              "362  0.131043  0.069016  0.029354  0.060197  0.282093  0.253809\n",
              "363  0.036182  0.032010  0.030090  0.071069  0.359737  0.435486\n",
              "364  0.014562  0.127332  0.035014  0.178579  0.803566  0.311641\n",
              "365  0.014427  0.134185  0.033460  0.186430  0.891134  0.311652\n",
              "\n",
              "[366 rows x 6 columns]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 13
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "HrNf8kNR9KnU",
        "colab_type": "text"
      },
      "source": [
        "##导入本地模块"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "hQ7VOhYu9Jet",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "import sys\n",
        "sys.path.append('/content/drive/My Drive/Colab Notebooks')"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "8XqZ_xeT9Q98",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "X_train = scaled_features\n",
        "X_test = scaled_features_test\n",
        "y_train = correct_facies_labels\n",
        "y_test = correct_facies_labels_test"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "1WZaSxbaoxwD",
        "colab_type": "text"
      },
      "source": [
        "##SVM开始了\n"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Ucta7R8RoxwD",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "from sklearn import svm\n",
        "\n",
        "clf = svm.SVC()"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "tjYep1ppoxwI",
        "colab_type": "text"
      },
      "source": [
        "现在我们可以使用上面创建的训练集来训练分类器。"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "BnX2gLUeoxwJ",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 86
        },
        "outputId": "797b4cb5-487e-41f5-c111-e4fca03f8254"
      },
      "source": [
        "clf.fit(X_train,y_train)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "SVC(C=1.0, break_ties=False, cache_size=200, class_weight=None, coef0=0.0,\n",
              "    decision_function_shape='ovr', degree=3, gamma='scale', kernel='rbf',\n",
              "    max_iter=-1, probability=False, random_state=None, shrinking=True,\n",
              "    tol=0.001, verbose=False)"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 17
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "QBvpD7QnoxwL",
        "colab_type": "text"
      },
      "source": [
        "现在一直在训练我们的数据模型,我们可以用它来预测相的特征向量在测试集。因为我们知道的真实相标签向量在测试集,我们可以用结果来评估分类的准确性。"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "KB7MljQHoxwM",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "predicted_labels = clf.predict(X_test)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "r_r1dwF2oxwO",
        "colab_type": "text"
      },
      "source": [
        "We need some metrics to evaluate how good our classifier is doing.  A [confusion matrix](http://www.dataschool.io/simple-guide-to-confusion-matrix-terminology/) is a table that can be used to describe the performance of a classification model.  [Scikit-learn](http://scikit-learn.org/stable/modules/generated/sklearn.metrics.confusion_matrix.html) allows us to easily create a confusion matrix by supplying the actual and predicted facies labels.\n",
        "\n",
        "The confusion matrix is simply a 2D array.  The entries of confusion matrix `C[i][j]` are equal to the number of observations predicted to have facies `j`, but are known to have facies `i`.  \n",
        "\n",
        "To simplify reading the confusion matrix, a function has been written to display the matrix along with facies labels and various error metrics.  See the file `classification_utilities.py` in this repo for the `display_cm()` function.\n",
        "\n",
        "我们需要一些指标来评估分类器的效果。 混淆矩阵是可用于描述分类模型性能的表。 Scikit-learn通过提供实际和预测的相貌标签，使我们能够轻松创建混淆矩阵。\n",
        "\n",
        "混淆矩阵只是2D数组。 混淆矩阵C [i] [j]的条目等于预测具有相j的观测次数，但已知具有相i。\n",
        "\n",
        "为了简化读取混淆矩阵，已编写了一个函数来显示矩阵以及相标和各种错误度量。 有关display_cm（）函数，请参见此存储库中的文件category_utilities.py。"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "BT0VKigGmQ9y",
        "colab_type": "text"
      },
      "source": [
        "这里需要导入一个py模块具体方法如下："
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "b4HrWWJjoxwP",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 173
        },
        "outputId": "1db245f1-380d-4122-9acb-e9c1ed062a95"
      },
      "source": [
        "from sklearn.metrics import confusion_matrix\n",
        "from classification_utilities import display_cm, display_adj_cm\n",
        "conf = confusion_matrix(y_test, predicted_labels)\n",
        "display_cm(conf, facies_labels, hide_zeros=True)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "     Pred    CS    MS    FS    SS    DM    LS   MDS Total\n",
            "     True\n",
            "       CS    12     2     5                       1    20\n",
            "       MS          54    11                      15    80\n",
            "       FS           7    63           2     1     7    80\n",
            "       SS           1     8     1                10    20\n",
            "       DM           1     2          49           1    53\n",
            "       LS                             3     9     1    13\n",
            "      MDS           5    10           5          80   100\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "wSp7tkdMoxwT",
        "colab_type": "text"
      },
      "source": [
        "The rows of the confusion matrix correspond to the actual facies labels.  The columns correspond to the labels assigned by the classifier.  For example, consider the first row. For the feature vectors in the test set that actually have label `SS`, 23 were correctly indentified as `SS`, 21 were classified as `CSiS` and 2 were classified as `FSiS`.\n",
        "\n",
        "混淆矩阵的行对应于实际的相图。列对应于分类器分配的标签。例如，考虑第一行。对于实际存在标签SS的测试集中的特征向量，正确识别为SS的有23个，识别为CSiS的有21个，识别为FSiS的有2个。\n",
        "\n",
        "The entries along the diagonal are the facies that have been correctly classified.  Below we define two functions that will give an overall value for how the algorithm is performing.  The accuracy is defined as the number of correct classifications divided by the total number of classifications.\n",
        "\n",
        "沿对角线的条目是已正确分类的相。 在下面，我们定义了两个函数，它们将为算法的执行提供总体价值。 准确度定义为正确分类的数量除以分类的总数。"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "z2-bI3fwoxwT",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "def accuracy(conf):\n",
        "    total_correct = 0.\n",
        "    nb_classes = conf.shape[0]\n",
        "    for i in np.arange(0,nb_classes):\n",
        "        total_correct += conf[i][i]\n",
        "    acc = total_correct/sum(sum(conf))\n",
        "    return acc"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "UxuaqShqoxwW",
        "colab_type": "text"
      },
      "source": [
        "As noted above, the boundaries between the facies classes are not all sharp, and some of them blend into one another.  The error within these 'adjacent facies' can also be calculated.  We define an array to represent the facies adjacent to each other.  For facies label `i`, `adjacent_facies[i]` is an array of the adjacent facies labels.\n",
        "\n",
        "如上所述，各相类型之间的界限并不都很明显，其中一些相互融合。这些“相邻相”内的误差也可以计算出来。我们定义了一个数组来表示彼此相邻的相。对于相标志i，相邻相[i]是相邻相标志的数组。"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "8F9TJVutoxwX",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "def accuracy_adjacent(conf, adjacent_facies):\n",
        "    nb_classes = conf.shape[0]\n",
        "    total_correct = 0.\n",
        "    for i in np.arange(0,nb_classes):\n",
        "        total_correct += conf[i][i]\n",
        "        for j in adjacent_facies[i]:\n",
        "            total_correct += conf[i][j]\n",
        "    return total_correct / sum(sum(conf))"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "bL1KemCeoxwa",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 35
        },
        "outputId": "8fa6001a-2b24-4d4c-b289-39446e629938"
      },
      "source": [
        "print('Facies classification accuracy = %f' % accuracy(conf))"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Facies classification accuracy = 0.732240\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "XDsp6A_Boxwd",
        "colab_type": "text"
      },
      "source": [
        "##最佳超参数\n",
        "The classifier so far has been built with the default parameters.  However, we may be able to get improved classification results with optimal parameter choices.\n",
        "\n",
        "到目前为止，分类器是使用默认参数构建的。然而，我们可能会得到改进的分类结果与最佳参数的选择。\n",
        "\n",
        "We will consider two parameters.  The parameter `C` is a regularization factor, and tells the classifier how much we want to avoid misclassifying training examples.  A large value of C will try to correctly classify more examples from the training set, but if `C` is too large  it may 'overfit' the data and fail to generalize when classifying new data. If `C` is too small then the model will not be good at fitting outliers and will have a large error on the training set.\n",
        "\n",
        "我们将考虑两个参数。 参数“ C”是一个正则化因子，它告诉分类器我们要避免对训练样本进行错误分类的程度。 较大的C值会尝试从训练集中正确分类更多示例，但是如果C值太大，则可能会“拟合”数据，并且在分类新数据时无法归纳。 如果C太小，则模型将无法很好地拟合离群值，并且训练集上的误差会很大。\n",
        "\n",
        "The SVM learning algorithm uses a kernel function to compute the distance between feature vectors.  Many kernel functions exist, but in this case we are using the radial basis function `rbf` kernel (the default).  The `gamma` parameter describes the size of the radial basis functions, which is how far away two vectors in the feature space need to be to be considered close.\n",
        "\n",
        "支持向量机学习算法利用核函数计算特征向量之间的距离。存在许多内核函数，但在本例中，我们使用径向基函数“rbf”内核(默认值)。参数描述径向基函数的大小，也就是特征空间中两个向量需要被认为是接近的距离。\n",
        "\n",
        "We will train a series of classifiers with different values for `C` and `gamma`.  Two nested loops are used to train a classifier for every possible combination of values in the ranges specified.  The classification accuracy is recorded for each combination of parameter values.  The results are shown in a series of plots, so the parameter values that give the best classification accuracy on the test set can be selected.\n",
        "\n",
        "我们将针对“ C”和“ gamma”训练一系列具有不同值的分类器。 两个嵌套循环用于为指定范围内值的每种可能组合训练分类器。 记录每个参数值组合的分类精度。 结果显示在一系列图中，因此可以选择在测试集上提供最佳分类精度的参数值。\n",
        "\n",
        "This process is also known as 'cross validation'.  Often a separate 'cross validation' dataset will be created in addition to the training and test sets to do model selection.  For this tutorial we will just use the test set to choose model parameters.\n",
        "\n",
        "这个过程也被称为“交叉验证”。通常，除了用于进行模型选择的培训和测试集之外，还会创建一个单独的“交叉验证”数据集。在本教程中，我们将使用测试集来选择模型参数。"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "6Cg8LHnpoxwd",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 662
        },
        "outputId": "d0c6a470-d4b1-4f30-b8d3-a3e6c41abb82"
      },
      "source": [
        "#model selection takes a few minutes, change this variable\n",
        "#to true to run the parameter loop\n",
        "do_model_selection = True\n",
        "\n",
        "if do_model_selection:\n",
        "    C_range = np.array([.01, 1, 5, 10, 20, 50, 100, 1000, 5000, 10000])\n",
        "    gamma_range = np.array([0.0001, 0.001, 0.01, 0.1, 1, 10])\n",
        "    \n",
        "    fig, axes = plt.subplots(3, 2, \n",
        "                        sharex='col', sharey='row',figsize=(10,10))\n",
        "    plot_number = 0\n",
        "    for outer_ind, gamma_value in enumerate(gamma_range):\n",
        "        row = int(plot_number / 2)\n",
        "        column = int(plot_number % 2)\n",
        "        cv_errors = np.zeros(C_range.shape)\n",
        "        train_errors = np.zeros(C_range.shape)\n",
        "        for index, c_value in enumerate(C_range):\n",
        "            \n",
        "            clf = svm.SVC(C=c_value, gamma=gamma_value)\n",
        "            clf.fit(X_train,y_train)\n",
        "            \n",
        "            train_conf = confusion_matrix(y_train, clf.predict(X_train))\n",
        "            cv_conf = confusion_matrix(y_test, clf.predict(X_test))\n",
        "        \n",
        "            cv_errors[index] = accuracy(cv_conf)\n",
        "            train_errors[index] = accuracy(train_conf)\n",
        "\n",
        "        ax = axes[row, column]\n",
        "        ax.set_title('Gamma = %g'%gamma_value)\n",
        "        ax.semilogx(C_range, cv_errors, label='CV error')\n",
        "        ax.semilogx(C_range, train_errors, label='Train error')\n",
        "        plot_number += 1\n",
        "        ax.set_ylim([0.2,1])\n",
        "        \n",
        "    ax.legend(bbox_to_anchor=(1.05, 0), loc='lower left', borderaxespad=0.)\n",
        "    fig.text(0.5, 0.03, 'C value', ha='center',\n",
        "             fontsize=14)\n",
        "             \n",
        "    fig.text(0.04, 0.5, 'Classification Accuracy', va='center', \n",
        "             rotation='vertical', fontsize=14)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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waLhw4evW79+feSVV16Z+u6771Y43DYzM5PPP/+8/PXXX596Mt8nMzMzz+d5SU9Pz++3OiEqukVEJEsgE6Y8woEytblj+dnccE5tmtWqcPzjRETyYeLEiWUiIiLcoEGDthze1qZNm/0XX3zxnn79+qWOHz/+j45n0qRJZapXr54WFxeXlvM8Dz/88OlJSUnxcXFxCXfddVc1gJSUlKjatWsndevWrXZcXFzil19+WTr78+XLl0fdeuutsfXr10+Mi4tLePPNN8sfztSsWbMGF1xwQb369evn+WHIU6EPUoqISJbf/gtbFvFU9CCqVijDvRc18DqRiATZvWPn1liycXdMQZ4zrmqZfc/2bLImr/3JycklmzRpsi+3fS1bttwfFhbGjz/+WLJNmzb7P/jgg/I9e/bclrPduHHjyi5btiw6OTl5kXOOTp061Zs0aVLpunXrpq1evbrEyJEjV3bs2HFVSkpKVPbno0aNOm3evHklFy1atGDDhg0RLVu2jO/cufMegIULF8b8+uuvCxo2bHhUgV8QNNItIiKQthe+foJ1pZJ4Z0cTnu7emJgojcuISOHr3r37tvfff79Ceno6X331Vfm+fftuz9nmyy+/LDt9+vSyCQkJCYmJiQnLly+PXrx4cTTAGWeckdaxY8e9h9tmf/7dd9+V6dWrV2pERAQ1atTIaNWq1Z4ZM2bEADRu3HhvsApu0Ei3iIgA/Pgq7NnInWm30qdlLc6pV8nrRCJSCI41Ih0sjRo12j9+/Pjyee3v16/f9osvvrj++eefv7tBgwb7atSokZGzjXOOO++8c8O99967Nfv2lJSUqJiYmED2bTmf5+VE250sjXSLiBR3ezbjvn+BGRGtWVO6Cfdf0tDrRCJShF1++eW709LS7Lnnnvvjf/ezZs0q+eWXX5YGSExMPFi+fPmMhx56KLZXr165foCyS5cuu957771KO3fuDANYuXJl5Lp16447mNyuXbvdY8eOrZCRkcH69esjfvrpp9Jt27bde7zjCoKKbhGR4m7acFzafh7Z25MnuydRNjrS60QiUoSFhYUxYcKE5V9//XXZGjVqJNWrVy9x8ODB1atXr/7HbUN69uyZunLlyujrrrtuR27n6N69+66rrroqtUWLFg3j4uISunXrduaOHTuOe6ulvn377khMTNwfHx+f2KFDh7ihQ4eurVmz5lEj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\n",
            "text/plain": [
              "<Figure size 720x720 with 6 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "bodJLJSuoxwg",
        "colab_type": "text"
      },
      "source": [
        "The best accuracy on the cross validation error curve was achieved for `gamma = 1`, and `C = 10`.  We can now create and train an optimized classifier based on these parameters:\n",
        "\n",
        "在gamma = 1和C = 10时，交叉验证误差曲线的精度最佳。现在，我们可以根据这些参数创建和训练一个优化的分类器"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "H_k0DgqJoxwh",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 52
        },
        "outputId": "3e65c545-5daa-441f-a627-7bcd3a57249e"
      },
      "source": [
        "clf = svm.SVC(C=10, gamma=1)        \n",
        "clf.fit(X_train, y_train)\n",
        "\n",
        "cv_conf = confusion_matrix(y_test, clf.predict(X_test))\n",
        "\n",
        "print('Optimized facies classification accuracy = %.2f' % accuracy(cv_conf))\n",
        "print(f'准确率{accuracy(cv_conf)}')"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Optimized facies classification accuracy = 0.89\n",
            "准确率0.8852459016393442\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "xxZOv_7boxwk",
        "colab_type": "text"
      },
      "source": [
        "[Precision and recall](https://en.wikipedia.org/wiki/Precision_and_recall) are metrics that give more insight into how the classifier performs for individual facies.  Precision is the probability that given a classification result for a sample, the sample actually belongs to that class.  Recall is the probability that a sample will be correctly classified for a given class.\n",
        "\n",
        "Precision and recall can be computed easily using the confusion matrix.  The code to do so has been added to the `display_confusion_matrix()` function:\n",
        "\n",
        "精度和回忆度是能够更深入地了解分类器对单个相的执行情况的指标。精度是给定一个样本的分类结果，这个样本实际上属于这个类别的概率。召回率是样本将被正确分类为给定类的概率。使用混淆矩阵可以很容易地计算出精确度和查全率。这样做的代码已经添加到display confusion matrix()函数中"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "k4dKTWldoxwk",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 242
        },
        "outputId": "137517a3-c34e-4290-bfe1-0f3ac0458dd5"
      },
      "source": [
        "display_cm(cv_conf, facies_labels, \n",
        "           display_metrics=True, hide_zeros=True)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "     Pred    CS    MS    FS    SS    DM    LS   MDS Total\n",
            "     True\n",
            "       CS    17     1                             2    20\n",
            "       MS          67     5                       8    80\n",
            "       FS           1    75     2                 2    80\n",
            "       SS           1     2    16                 1    20\n",
            "       DM                            51           2    53\n",
            "       LS                                  13          13\n",
            "      MDS           7     6     2                85   100\n",
            "\n",
            "Precision  1.00  0.87  0.85  0.80  1.00  1.00  0.85  0.89\n",
            "   Recall  0.85  0.84  0.94  0.80  0.96  1.00  0.85  0.89\n",
            "       F1  0.92  0.85  0.89  0.80  0.98  1.00  0.85  0.89\n"
          ],
          "name": "stdout"
        }
      ]
    }
  ]
}